#coding=utf-8

from django.contrib.sites.models import Site
from django.db import models
from DjangoUeditor.models import UEditorField
from PublicTool.BaseField import CharNullField
from PublicTool.BaseModel import Base_TimeModel, Base_UserModel

SELECT_YES = 1
SELECT_NO = 0
SELECT_IS = (
        (SELECT_YES, '是'),
        (SELECT_NO, '否'),
    )

__author__ = 'czq'
class SiteInfo(models.Model):

    site=models.OneToOneField(Site)
    bbsName=CharNullField(u"论坛名称",max_length=20)
    putOnRecord=CharNullField(u'备案信息代码',max_length=20)
    isClose=models.BooleanField(u"是否关闭论坛",help_text=u'暂时将论坛关闭(包括论坛、个人空间、相册等), 其他人无法访问, 但不影响管理员访问',choices=SELECT_IS,default=SELECT_NO)
    isZone=models.BooleanField(u'是否启用个人空间服务',choices=SELECT_IS,default=SELECT_NO)
    zoneName=CharNullField(u"空间名称",max_length=20)
    isAlbum=models.BooleanField(u'是否启用相册服务',choices=SELECT_IS,default=SELECT_NO)
    albumName=CharNullField(u"相册名称",max_length=20)
    def __unicode__(self):
		return u'%s' % self.site.name
    class Meta:
        verbose_name = u'网站信息'
        verbose_name_plural = u'网站信息'

class SiteOptimization(models.Model):
    site=models.OneToOneField(Site)
    searchInterval=models.PositiveSmallIntegerField(u'搜索时间限制',default=30,help_text=u'两次搜索间隔小于此时间将被禁止, 0 为不限制')
    userOnlineInterval=models.PositiveSmallIntegerField(u'用户在线时间更新时长',default=20,help_text=u'	可统计每个用户总共和当月的在线时间,本设置用以设定更新用户在线时间的时间频率.例如设置为 10,则用户每在线 10 分钟更新一次记录.本设置值越小,则统计越精确,但消耗资源越大.建议设置为 5～30 范围内,0 为不记录用户在线时间')
    notifySaveDay=models.PositiveSmallIntegerField(u'通知保留天数',default=7,help_text=u'0为永久保留')
    indexChildClassNum=models.PositiveSmallIntegerField(u'首页版块数',default=7,help_text=u'首页每个分类下 最多显示版块数')
    #notifySaveDay=models.IntegerField(u'',default=7,help_text=u'')
    def __unicode__(self):
		return u'%s' % self.site.name
    class Meta:
        verbose_name = u'站点优化'
        verbose_name_plural = u'站点优化'

class SiteSafe(models.Model):
    site=models.OneToOneField(Site)
    themeAddInterval=models.PositiveSmallIntegerField(u'发帖灌水预防',default=60,help_text=u'秒,两次发帖间隔小于此时间, 或两次发送短消息间隔小于此时间的二倍将被禁止, 0 为不限制题')
    replyAddInterval=models.PositiveSmallIntegerField(u'回复灌水预防',default=10,help_text=u'秒,两次回复间隔小于此时间, 0 为不限制题')
    searchNumMax=models.IntegerField(u'60 秒最大搜索次数',default=5,help_text=u'论坛系统每 60 秒系统响应的最大搜索次数, 0 为不限制. 注意: 如果服务器负担较重, 建议设置为 5, 或在 5~20 范围内取值, 以避免过于频繁的搜索造成数据表被锁')


    def __unicode__(self):
		return u'%s' % self.site.name
    class Meta:
        verbose_name = u'安全与防灌水'
        verbose_name_plural = u'安全与防灌水'


class SiteRegister(models.Model):
    REGISTER_TWO = 2
    REGISTER_InvitationCode = 3
    REGISTER_SELECT = (
        (SELECT_YES, u'允许注册'),
        (REGISTER_TWO, u'允许常规注册及邀请链接式注册'),
        (REGISTER_InvitationCode, u'关闭注册，仅通过邀请码注册'),
        (SELECT_NO, u'不允许任何新用户注册'),
    )
    newUserVerif_SELECT=(
        (SELECT_NO, u'无'),
        (SELECT_YES, u'Email验证'),
        (REGISTER_TWO, u'人工审核'),
    )


    site=models.OneToOneField(Site)
    newUserRegister=models.PositiveSmallIntegerField(u"新用户注册设置",choices=REGISTER_SELECT,default=SELECT_YES,help_text=u'“邀请链接式注册”是站点推广的很有效的手段，对已注册用户给予论坛积分奖励，让其通过系统生成的推广链接邀请其他用户访问，并引导其注册，每注册成功一位， 给予该链接所有用户奖励积分，关于奖励积分设置，请到积分设置处设置；“仅通过邀请码注册”是控制论坛注册人数，或有定向性的允许访客注册的解决方案，该方案开启后，访客必须拥有 邀请码才可以注册成功，邀请码由已注册用户在invite.aspx页面购买；不允许新用户注册选项不会影响已注册用户。')
    #isRealName=models.BooleanField(u'用户资料中是否必须填写实名选项',choices=SELECT_IS,default=SELECT_NO)
    userInfoKeyword=CharNullField(u"用户信息保留关键字",max_length=200,default=u'|admin|管理员|版主|超级版主|',help_text=u'用户在其用户信息(如用户名、昵称、自定义头衔等)中无法使用这些关键字. 每个关键字一行, 可使用通配符 "*" 如 "*版主*"(不含引号)')
    newUserVerif=models.PositiveSmallIntegerField(u"新用户注册验证",choices=newUserVerif_SELECT,default=SELECT_NO,help_text=u'	选择"无"用户可直接注册成功;选择"Email 验证"将向用户注册 Email 发送一封验证邮件以确认邮箱的有效性;选择"人工审核"将由管理员人工逐个确定是否允许新用户注册')
    emailYes=CharNullField(u'Email 允许地址',max_length=200,help_text=u'只允许某些域名结尾的邮箱注册, 每行一个域名, 例如 @hotmail.com.注意:此项开启时, 下面的"Email 禁止地址"项设置无效')
    emailNo=CharNullField(u'Email 禁止地址',max_length=200,help_text=u'由于一些大型邮件服务提供商会过滤论坛程序发送的有效邮件, 您可以要求新用户不得以某些域名结尾的邮箱注册, 每行一个域名, 例如 @hotmail.com')
    ipRegisterInterval=models.PositiveSmallIntegerField(u'IP注册间隔限制',default=1,help_text=u'(单位:小时) 同一 IP 在本时间间隔内将只能注册一个帐号, 限制对自修改后的新注册用户生效, 0 为不限制')
    newUserNovitiate=models.PositiveSmallIntegerField(u'新手见习期限',default=0,help_text=u'(单位:分钟) 新注册用户在本期限内将无法发帖, 不影响版主和管理员, 0 为不限制')
    emailRegisterMultipleUser=models.BooleanField(u'允许同一 Email注册不同用户',choices=SELECT_IS,default=SELECT_NO,help_text=u'选择"否" ,一个 Email 地址只能注册一个用户名')

    registerLicenseAgreement=UEditorField(u"注册许可协议",height=200,width=600,imagePath="SiteRegister",imageManagerPath="SiteRegister",filePath="SiteRegister",null=True,blank=True)
    registerMsg=UEditorField(u"欢迎短消息内容",height=200,width=600,imagePath="SiteRegister",imageManagerPath="SiteRegister",filePath="SiteRegister",null=True,blank=True)
    ipVisitYes=CharNullField(u'IP 访问列表',max_length=200,help_text=u'只有当用户处于本列表中的 IP 地址时才可以访问本论坛, 列表以外的地址访问将视为 IP 被禁止, 仅适用于诸如企业、学校内部论坛等极个别场合. 本功能对管理员没有特例, 如果管理员不在此列表范围内将同样不能登录, 请务必慎重使用本功能. 每个 IP 一行, 例如 "192.168.*.*"(不含引号) 可匹配 192.168.0.0~192.168.255.255 范围内的所有地址, 留空为所有 IP 除明确禁止的以外均可访问')
    ipVisitNo=CharNullField(u'IP 禁止访问列表',max_length=200,help_text=u'当用户处于本列表中的 IP 地址时将禁止访问本论坛. 每个 IP 一行, 例如 "192.168.*.*"(不含引号) 可匹配 192.168.0.0~192.168.255.255 范围内的所有地址')
    ipVisitYes_Admin=CharNullField(u'IP 访问列表',max_length=200,help_text=u'只有当管理员(超级版主及版主不在此列)处于本列表中的 IP 地址时才可以访问论坛系统设置, 列表以外的地址访问将无法访问, 但仍可访问论坛前端用户界面, 请务必慎重使用本功能. 每个 IP 一行, 例如 "192.168.*.*"(不含引号) 可匹配 192.168.0.0~192.168.255.255 范围内的所有地址, 留空为所有 IP 除明确禁止的以外均可访问系统设置')

    def __unicode__(self):
		return u'%s' % self.site.name
    class Meta:
        verbose_name = u'用户注册设置'
        verbose_name_plural = u'用户注册设置'

class SiteFunction(models.Model):
    site=models.OneToOneField(Site)
    isTrafficStatistics=models.BooleanField(u'论坛流量统计',choices=SELECT_IS,default=SELECT_NO,help_text=u'选择"是"将打开论坛统计功能,提供详细的论坛访问统计信息.')
    manageRecordSaveDay=models.PositiveSmallIntegerField(u'管理记录保留时间',default=3,help_text=u'系统中保留管理记录的时间,默认为 3 个月,建议在 3～6 个月的范围内取值')
    isManageToUser=models.BooleanField(u'管理操作理由是否通知作者',choices=SELECT_IS,default=SELECT_NO,help_text=u'是否将管理操作的理由短消息通知作者')

    pageSize_Theme=models.PositiveSmallIntegerField(u'每页主题数',default=10,help_text=u'版块每页显示的主题数')
    pageSize_Reply=models.PositiveSmallIntegerField(u'每页回复数',default=10,help_text=u'看主题时每页回复数')
    hotTopicReplyNum=models.PositiveSmallIntegerField(u'热门话题最低帖数',default=10,help_text=u'超过一定帖子数的话题将显示为热门话题')
    updateThemeRecord=models.BooleanField(u'编辑帖子附加编辑记录',choices=SELECT_IS,default=SELECT_NO,help_text=u'在 60 秒后编辑帖子添加“本帖由 xxx 于 xxxx-xx-xx 编辑”字样. 管理员编辑不受此限制')
    replyToMsg=models.BooleanField(u'发送回复通知',choices=SELECT_IS,default=SELECT_NO,help_text=u'选择是否在回复选项中默认选择')
    replyToEmail=models.BooleanField(u'发送邮件给楼主',choices=SELECT_IS,default=SELECT_NO,help_text=u'选择是否在回复选项中默认选择')
    newThemeTime=models.PositiveSmallIntegerField(u'查看新帖时间',default=120,help_text=u'	设置多长时间内发布的帖子算是新帖')
    def __unicode__(self):
		return u'%s' % self.site.name
    class Meta:
        verbose_name = u'站点功能'
        verbose_name_plural = u'站点功能'



class SiteSetting(Base_TimeModel):
    site=models.OneToOneField(Site,verbose_name=u"网站")
    #siteName=models.CharField(u"网站名称",max_length=10)
    wapTop=models.TextField(u"wap顶部",blank=True,null=True)
    wapDown=models.TextField(u"wap底部",blank=True,null=True)
    userIndexTop=models.TextField(u'用户顶部',blank=True,null=True)
    userIndexDown=models.TextField(u'用户底部',blank=True,null=True)
    homeIndexTop=models.TextField(u'首页顶部',blank=True,null=True)
    homeIndexDown=models.TextField(u'首页底部',blank=True,null=True)


    #allow_upload_type=models.CharField(u"允许上传的文件类型",max_length=200,default='|zip|rar|doc|docx|xls|xlsx|ppt|pptx|txt|pdf|gz|7z|')
    #allow_upload_singleSize=models.PositiveSmallIntegerField(u"最大文件",default=0,help_text=u'单位:M,每次上次的单个文件的大小,0表示无限制')
    #allow_upload_totalSize=models.PositiveSmallIntegerField(u'网站总空间',default=0,help_text=u"单位:G,防止网站上传大量文件影响其他网站或服务器的运行,0表示无限制,该字段功能暂时没用")
    #SaveFilesPath=models.CharField(u'文件保存路径',max_length=20,blank=True,null=True)
    #SaveFilesType=models.IntegerField(blank=True,null=True)
    #MoneyName=models.CharField(u'货币名称',max_length=10,default=u'金钱')
    #ExprName=models.CharField(u"经验名称",max_length=10,default=u'经验')
    SiteFilter=models.TextField(u'过滤关键字',blank=True,null=True)


    def __unicode__(self):
		return u'%s' % self.site.name


    class Meta:
        verbose_name = u'网站设置'
        verbose_name_plural = u'网站设置'
        ordering = ['-addTime']

class SiteExtcredit(models.Model):
    NUMBER_ONE=1
    NUMBER_TWO=2
    NUMBER_THREE=3
    NUMBER_SELECT = (
        (NUMBER_ONE, u'1'),
        (NUMBER_TWO, u'2'),
        (NUMBER_THREE, u'3'),
    )
    site=models.ForeignKey(Site)
    number=models.PositiveIntegerField(u'第几个积分',choices=NUMBER_SELECT,default=NUMBER_ONE)
    name=CharNullField(u'名称',max_length=10,help_text=u'该项积分的名称, 如果为空则不启用该项积分显示')
    unit=CharNullField(u'单位',max_length=10,help_text=u'	如金币,元等')
    exchangeRatio=models.PositiveSmallIntegerField(u'兑换比率',default=0,help_text=u'兑换比率为单项积分对应一个单位标准积分的值, 例如 extcredits1 的比率为 1.5(相当于 1.5 个单位标准积分)、extcredits2 的比率为 3(相当于 3 个单位标准积分)、extcredits3 的比率为 15(相当于 15 个单位标准积分), 则 extcredits3 的 1 分相当于 extcredits2 的 5 分或 extcredits1 的 10 分. 一旦设置兑换比率, 则用户将可以在控制面板中自行兑换各项设置了兑换比率的积分, 如不希望实行积分自由兑换, 请将其兑换比率设置为 0')
    registerIntegral=models.PositiveSmallIntegerField(u'注册初始积分',default=0,help_text=u'')
    addTheme=models.PositiveSmallIntegerField(u'发主题',default=0,help_text=u'作者发新主题增加的积分数, 如果该主题被删除, 作者积分也会按此标准相应减少')
    addReply=models.PositiveSmallIntegerField(u'回复',default=0,help_text=u'作者发新回复增加的积分数, 如果该回复被删除, 作者积分也会按此标准相应减少')
    addEssence=models.PositiveSmallIntegerField(u'加精华',default=0,help_text=u'主题被加入精华时单位级别作者增加的积分数(根据精华级别乘以1～3), 如果该主题被移除精华, 作者积分也会按此标准相应减少')
    uploadFile=models.PositiveSmallIntegerField(u'上传附件',default=0,help_text=u'用户每上传一个附件增加的积分数, 如果该附件被删除, 发布者积分也会按此标准相应减少')
    downloadFile=models.PositiveSmallIntegerField(u'下载附件',default=0,help_text=u'用户每下载一个附件扣除的积分数. 注意: 分值为负数时才能扣除相应的积分.如果允许游客组下载附件, 本策略将可能被绕过')
    sendMsg=models.PositiveSmallIntegerField(u'发短消息',default=0,help_text=u'用户每发送一条短消息扣除的积分数.注意: 分值为负数时才能扣除相应的积分.')
    search=models.PositiveSmallIntegerField(u'搜索',default=0,help_text=u'用户每进行一次帖子搜索或短消息搜索扣除的积分数.注意: 分值为负数时才能扣除相应的积分.')
    tradingSuccess=models.PositiveSmallIntegerField(u'交易成功',default=0,help_text=u'用户每成功进行一次交易后增加的积分数')
    vote=models.PositiveSmallIntegerField(u'参与投票',default=0,help_text=u'用户每参与一次投票后增加的积分数')
    InvitedToRegister=models.PositiveSmallIntegerField(u'邀请注册',default=0,help_text=u'')
    def __unicode__(self):
		return u'%s' % self.site.name
    class Meta:
        verbose_name = u'积分设置'
        verbose_name_plural = u'积分设置'

class SiteIntegral(models.Model):
    site=models.OneToOneField(Site,verbose_name=u"网站")
    totalIntegral=CharNullField(u'总积分计算公式',max_length=100,help_text=u'总积分是衡量用户级别的唯一标准, 您可以在此设定用户的总积分计算公式, 其中 posts 代表发帖数;digestposts 代表精华帖数;oltime 代表用户总在线时间(分钟);extcredits1～extcredits8 分别代表上述 8 个自定义积分. 公式中可使用包括 + - * / () 在内的运算符号, 例如"posts*0.5+digestposts*10+oltime*10+extcredits1*2+extcredits8"代表总积分为"发帖数*0.5+精华帖数*10+总在线时间(分钟)*10+自定义积分1*2+自定义积分8". 注意: 一旦修改积分公式, 将可能导致所有用户的积分和所在会员用户组重新计算, 因此会加重服务器负担, 直至全部用户更新完毕. 其中在线时间,用户可以通过长时间联机刷新而作弊, 请慎用')
    themeBusinessExtcredit=models.ForeignKey(SiteExtcredit,related_name='themeBusinessExtcredit',verbose_name=u'主题(附件)买卖的积分:')
    themeRewardExtcredit=models.ForeignKey(SiteExtcredit,related_name='themeRewardExtcredit',verbose_name=u'悬赏主题使用的积分:')
    transferMin=models.IntegerField(u'转账最低余额',help_text=u'积分转账后要求用户所拥有的余额最小数值. 利用此功能, 您可以设置较大的余额限制, 使积分小于这个数值的用户无法转账;也可以将余额限制设置为负数, 使得转账在限额内可以透支',default=9999999)
    themeBusinessExtcreditMax=models.SmallIntegerField(u'单主题最高收入',default=100,help_text=u'设置单一主题作者出售所得的最高税后积分收入, 超过此限制后购买者将仍然被扣除相应积分, 但主题作者收益将不再上涨. 本限制只在主题买卖时起作用, 0 为不限制')
    integralTransferTax=models.PositiveIntegerField(u'积分交易税',default=10,help_text=u'积分交易税(损失率)为用户在利用积分进行转让、兑换、买卖时扣除的税率, 范围为 0～1 之间的浮点数, 例如设置为 0.2, 则用户在转换 100 个单位积分时, 损失掉的积分为 20 个单位, 0 为不损失')
    exchangeMin=models.IntegerField(u'兑换最低余额',default=100,help_text=u'	积分兑换后要求用户所拥有的余额最小数值. 利用此功能, 您可以设置较大的余额限制, 使积分小于这个数值的用户无法兑换;也可以将余额限制设置为负数, 使得兑换在限额内可以透支')
    themeBusinessTimeMax=models.PositiveIntegerField(u'单主题最高出售时限',default=24,help_text=u'	设置当主题被作者出售时, 系统允许自主题发布时间起, 其可出售的最长时间. 超过此时间限制后将变为普通主题, 阅读者无需支付积分购买, 作者也将不再获得相应收益, 以小时为单位, 0 为不限制')
    delThemeNoMoney=models.PositiveSmallIntegerField(u'删帖不减积分时间期限',default=30,help_text=u'	设置版主或管理员从前台删除发表于多少天以前的帖子时, 不更新用户积分, 可用于清理老帖子而不对作者积分造成损失. 0 为不使用此功能, 始终更新用户积分')

    def __unicode__(self):
		return u'%s' % self.site.name
    class Meta:
        verbose_name = u'积分获取设置'
        verbose_name_plural = u'积分获取设置'

#class SiteFileType(Base_UserModel):
#    extension=models.CharField(u'扩展名',max_length=10)
#    maxSize=models.SmallIntegerField(u'最大尺寸',default=2048,help_text=u'单位:k')
#    def __unicode__(self):
#		return u'%s' % self.extension
#    class Meta:
#        verbose_name = u'附件类型设置'
#        verbose_name_plural = u'附件类型设置'


class SiteFileType(Base_UserModel):
    extension=models.CharField(u'扩展名',max_length=10)
    maxSize=models.SmallIntegerField(u'最大尺寸',default=2048,help_text=u'单位:k')
    def __unicode__(self):
		return u'%s' % self.extension
    class Meta:
        verbose_name = u'附件类型设置'
        verbose_name_plural = u'附件类型设置'

class SiteFileClass(Base_UserModel):
    name=models.CharField(u'名称',max_length=20)
    fileType=models.ManyToManyField(SiteFileType)
    def __unicode__(self):
		return u'%s' % self.name
    class Meta:
        verbose_name = u'附件分类列表'
        verbose_name_plural = u'附件分类列表'

class SiteEmail(models.Model):
    site=models.OneToOneField(Site,verbose_name=u"网站")
    smtpServer=models.CharField(u'SMTP服务器',max_length=30,help_text=u'设置发送邮件的SMTP服务器地址',default='smtp.qq.com')
    smtpEmail=models.CharField(u'系统邮箱名称',max_length=30,help_text=u'设置发送邮件的邮箱地址',default='****@qq.com')
    smtpPassword=models.CharField(u'系统邮箱密码',max_length=40,help_text=u'设置邮箱的密码')
    smtpPort=models.PositiveSmallIntegerField(u'SMTP端口',help_text=u'设置SMTP服务器的端口',default=25)
    smtpUserName=models.CharField(u'用户名',max_length=30,help_text=u'设置邮箱的用户名')

    def __unicode__(self):
		return u'%s' % self.site.name
    class Meta:
        verbose_name = u'邮箱设置'
        verbose_name_plural = u'邮箱设置'